#ifndef __MAIN_H
#define __MAIN_H    

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <stdint.h>
#include "share_mem/src/share_mem.h"
#include <signal.h>
#include <syslog.h> 

#define DEBUG                   (1)
#define CAN_ID                  (0x123)
#define ARRAY_SIZE(arr)         (sizeof(arr) / sizeof((arr)[0]))
#define DO_TYPE                 (HES_UINT16)


typedef enum{
    U8 = 0,
    U16,
    U32,
}ModbusDataType;

typedef enum{
    T_Read = 0,
    T_CtrlStatus,//遥控命令收到后 置1就写配置地址内存值为0xDDDD，置0就写配置地址内存值为0xEEEE
    T_CtrlSwicth,//遥控命令收到后 置1就置配置地址下的bit位为1，高8位进行计数+1，置0同理
    T_SetValue,
} OpType;

typedef struct {
    char*    desc; 
    uint8_t  chn;
    uint8_t  devAddr;
    uint8_t  funCode;
    uint16_t regAddr;
    uint32_t addr;    //(注意：如果opType=T_CtrlSwicth  地址配置的格式=地址*10+bit位)
    OpType   opType;
    uint8_t  dataNum;
    ModbusDataType dataTypeTab[256];
} MsgAddrMap;


MsgAddrMap msgAddrMap[] = {
    //desc,     chn,  devAddr, funCode, regAddr,   addr,             opType,     dataNum
    {"消防",     0,      1,       3,     0x0001,    520,             T_Read,        2,   {U16,U16}},
    {"消防",     0,      1,       3,     0x000B,    524,             T_Read,        3,   {U16,U16,U16}},  
    {"消防",     0,      1,       3,     0x0014,    530,             T_Read,        35,  {U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16}},    
    {"消防",     0,      1,       6,     0x0000,    1310760,         T_CtrlSwicth,  0},  //消防启停
    {"电导率",   0,      7,       3,     0x0002,    600,             T_Read,        18,  {U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16}}, 
    {"虚拟IO",   0,      10,      6,     0x1001,    131064,          T_CtrlStatus,  0},  
    {"虚拟IO",   0,      10,      6,     0x1002,    131066,          T_CtrlStatus,  0},  
    {"虚拟IO",   0,      10,      6,     0x1003,    131068,          T_CtrlStatus,  0}, 
    
    {"空调1",    1,      1,       3,     0x0100,    232,             T_Read,        6,   {U16,U16,U16,U16,U16,U16}},
    {"空调1",    1,      1,       3,     0x0500,    244,             T_Read,        9,   {U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"空调1",    1,      1,       3,     0x0600,    262,             T_Read,        33,  {U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"空调1",    1,      1,       6,     0x0801,    1310740,         T_CtrlSwicth,  0},  //空调启停                                              
    {"空调2",    1,      2,       3,     0x0100,    328,             T_Read,        6,   {U16,U16,U16,U16,U16,U16}},
    {"空调2",    1,      2,       3,     0x0500,    340,             T_Read,        9,   {U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"空调2",    1,      2,       3,     0x0600,    358,             T_Read,        33,  {U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"空调2",    1,      2,       6,     0x0801,    1310740,         T_CtrlSwicth,  0},    
    
    {"液冷1",    2,      3,       3,     0x0001,    140,             T_Read,        12,  {U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"液冷1",    2,      3,       3,     0x0015,    164,             T_Read,        1,   {U16}},
    {"液冷1",    2,      3,       3,     0x001F,    166,             T_Read,        9,   {U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"液冷1",    2,      3,       6,     0x00CA,    131062,          T_CtrlStatus,  0},
    {"液冷2",    2,      5,       3,     0x0001,    186,             T_Read,        12,  {U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"液冷2",    2,      5,       3,     0x0015,    210,             T_Read,        1,   {U16}},
    {"液冷2",    2,      5,       3,     0x001F,    212,             T_Read,        9,   {U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"液冷2",    2,      5,       6,     0x00CA,    131062,          T_CtrlStatus,  0},  // 液冷启停控制是写状态 特殊要求
    
    {"空调3",    3,      6,       3,     0x0100,    424,             T_Read,        6,   {U16,U16,U16,U16,U16,U16}},
    {"空调3",    3,      6,       3,     0x0500,    436,             T_Read,        9,   {U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"空调3",    3,      6,       3,     0x0600,    454,             T_Read,        33,  {U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16,U16}},
    {"空调3",    3,      6,       6,     0x0801,    1310740,         T_CtrlSwicth,  0},   
    {"除湿机1",  3,      8,       3,     0x0000,    636,             T_Read,        6,   {U16,U16,U16,U16,U16,U16}},
    {"除湿机2",  3,      9,       3,     0x0000,    656,             T_Read,        6,   {U16,U16,U16,U16,U16,U16}},
};

#endif
